﻿// ===============================================================================
//  Copyright © ymind.net. All rights reserved .
//  官方网站：http://ymind.net/
//  版权所有：彦铭工作室 老陈出品
// ===============================================================================

using System;
using System.Runtime.InteropServices;
using System.Runtime.Serialization;
using System.Text;

namespace Lcsoft.Data.RDBMS
{
	/// <summary>
	/// 表示访问数据库时引发的异常。
	/// </summary>
	[ComVisible(true)]
	[Serializable]
	public class SimpleSqlException : ApplicationException
	{
		/// <summary>
		/// 初始化 <see cref="SimpleSqlException"/> 类的新实例。
		/// </summary>
		public SimpleSqlException() { }

		/// <summary>
		/// 使用指定错误消息初始化 <see cref="SimpleSqlException"/> 类的新实例。
		/// </summary>
		/// <param name="message">
		/// 描述错误的消息。
		/// </param>
		public SimpleSqlException(string message) : base(message) { }

		/// <summary>
		/// 用序列化数据初始化 <see cref="SimpleSqlException"/> 类的新实例。
		/// </summary>
		/// <param name="serializationInfo">保存序列化对象数据的对象。</param>
		/// <param name="streamingContext">有关源或目标的上下文信息。</param>
		public SimpleSqlException(SerializationInfo serializationInfo, StreamingContext streamingContext) : base(serializationInfo, streamingContext) { }

		/// <summary>
		/// 使用指定错误消息和对作为此异常原因的内部异常的引用来初始化 <see cref="SimpleSqlException"/> 类的新实例。
		/// </summary>
		/// <param name="message">解释异常原因的错误消息。</param>
		/// <param name="exception">导致当前异常的异常。如果 innerException 参数不为空引用，则在处理内部异常的 catch 块中引发当前异常。</param>
		public SimpleSqlException(string message, Exception exception) : base(_FormatErrorMessage(message, exception), exception) { }

		/// <summary>
		/// 格式化错误消息的内容以便显示。
		/// </summary>
		/// <param name="message">格式化后的错误消息的标题。</param>
		/// <param name="ex">要格式化的异常的实例。</param>
		/// <returns>返回包含格式化后的错误消息的字符串。</returns>
		private static string _FormatErrorMessage(string message, Exception ex)
		{
			var msgBuilder = new StringBuilder(message);
			msgBuilder.AppendFormat("{0}{1}", ex.Message, Environment.NewLine);
			msgBuilder.AppendFormat("Source: {0}{1}", ex.Source, Environment.NewLine);
			msgBuilder.AppendFormat("StackTrace: {0}{1}", ex.StackTrace, Environment.NewLine);

			if (ex.InnerException != null) msgBuilder.AppendFormat("Inner Exception: {0}{1}", ex.InnerException.Message, Environment.NewLine);

			return msgBuilder.ToString();
		}
	}
}
